/**
 * 原生有flat方法
 * 方法一 、forEach push
 * @param {*} arr
 */
function myFlat(targetArr, result = []) {
  if (!Array.isArray(targetArr)) return result;

  targetArr.forEach((item) => {
    if (Array.isArray(item)) {
      myFlat(item, result);
    } else {
      result.push(item);
    }
  });

  return result;
}

/**
 * 放法2： findIndex splice
 * 找到是数组的下标，然后将数组解构用splice替换
 * @param {*} targetArr
 */
function myFlat2(targetArr) {
  if (!Array.isArray(targetArr)) return [];

  while (1) {
    const index = targetArr.findIndex((item) => Array.isArray(item));
    if (index === -1) return targetArr;
    targetArr.splice(index, 1, ...targetArr[index]);
  }
}

/**
 * 方法3：stack
 * 使用栈这种数据结果，其本质上和递归的算法是完全相同的；但是使用栈来理解的话，会极大的减小心智负担
    使用两个栈a和b，开始的时候将原始数组整体放入到a栈中去，此时b栈为空；
    然后对a栈执行下面的动作，直到a栈为空：
    弹栈->判断弹出元素是否是数组，如果不是，则进入栈b，如果是则拆包一次，再重新进入栈a
    最后输出栈b即可
 * @param {*} targetArr 
 */
function myFlat3(targetArr) {
  if (!Array.isArray(targetArr)) return [];
  // 入栈
  const a = [...targetArr];
  const b = [];

  while (a.length) {
    const item = a.shift();

    // 如果是数组，解构后入栈
    if (Array.isArray(item)) {
      a.unshift(...item);
    } else {
      b.push(item);
    }
  }

  return b;
}

// eg
// const rst = myFlat([[[[[[1], 2], 3], 4], 5, 6], 7]);
// const rst = myFlat2([[[[[[1], 2], 3], 4], 5, 6], 7]);
const rst = myFlat3([[[[[[1], 2], 3], 4], 5, 6], 7]);
console.log("rst: ", rst);
